{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Conx\n", "\n", "Neural network library in Python built on top of Theano." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "! pip install conx -U" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.0.2'" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import conx\n", "conx.__version__" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from conx import Network" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "net = Network(2, 2, 1)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Network:--------------------------------------------------\n", "Layer 0:\n", " Type: \n", " Act : sigmoid\n", " In : 2\n", " Out : 2\n", "--------------------------------------------------\n", "Layer 1:\n", " Type: \n", " Act : sigmoid\n", " In : 2\n", " Out : 1\n", "--------------------------------------------------" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'cpu'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.get_device()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ok, now we are ready to train a neural network to perform the XOR function." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "inputs = [[0, 0],\n", " [0, 1],\n", " [1, 0],\n", " [1, 1]]\n", "\n", "def xor(inputs):\n", " a = inputs[0]\n", " b = inputs[1]\n", " return [int((a or b) and not(a and b))]\n", "\n", "net.set_inputs(inputs)\n", "net.set_target_function(xor)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "Input: [0, 0]\n", "Output: [ 0.57249548]\n", "\n", "Input: [0, 1]\n", "Output: [ 0.55341458]\n", "\n", "Input: [1, 0]\n", "Output: [ 0.54596641]\n", "\n", "Input: [1, 1]\n", "Output: [ 0.53420271]\n", "\n", "--------------------------------------------------\n", "Epoch: 0 TSS error: 1.01870865086 %correct: 0.0\n" ] } ], "source": [ "net.test()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 0 TSS error: 1.01870865086 %correct: 0.0\n", "Epoch: 500 TSS error: 0.997564790511 %correct: 0.0\n", "Epoch: 1000 TSS error: 0.978894857312 %correct: 0.0\n", "Epoch: 1500 TSS error: 0.847307270827 %correct: 0.0\n", "Epoch: 2000 TSS error: 0.382920147885 %correct: 0.0\n", "Epoch: 2500 TSS error: 0.132917913521 %correct: 0.0\n", "Epoch: 3000 TSS error: 0.0691455650806 %correct: 0.0\n", "Epoch: 3500 TSS error: 0.044634963646 %correct: 0.25\n", "--------------------------------------------------\n", "Epoch: 3903 TSS error: 0.0342306590732 %correct: 1.0\n", "CPU times: user 3.06 s, sys: 21 ms, total: 3.08 s\n", "Wall time: 3.05 s\n" ] } ], "source": [ "%%time\n", "net.train()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0.0804926])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "net.propagate([1, 1])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "Input: [1, 0]\n", "Output: [ 0.9001267]\n", "\n", "Input: [0, 1]\n", "Output: [ 0.90186287]\n", "\n", "Input: [1, 1]\n", "Output: [ 0.0804926]\n", "\n", "Input: [0, 0]\n", "Output: [ 0.09013882]\n", "\n", "--------------------------------------------------\n", "Epoch: 3903 TSS error: 0.0342096396539 %correct: 1.0\n" ] } ], "source": [ "net.test()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "Input: [1, 0]\n", "Output: [ 0.65098615]\n", "\n", "Input: [0, 1]\n", "Output: [ 0.6821943]\n", "\n", "Input: [1, 1]\n", "Output: [ 0.65927293]\n", "\n", "Input: [0, 0]\n", "Output: [ 0.67246906]\n", "\n", "--------------------------------------------------\n", "Epoch: 0 TSS error: 1.10966656769 %correct: 0.0\n" ] } ], "source": [ "net.reset()\n", "net.test()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 0 TSS error: 1.10966656769 %correct: 0.0\n", "Epoch: 500 TSS error: 0.968951497599 %correct: 0.0\n", "Epoch: 1000 TSS error: 0.836586879967 %correct: 0.0\n", "Epoch: 1500 TSS error: 0.726427364212 %correct: 0.0\n", "Epoch: 2000 TSS error: 0.396999161472 %correct: 0.0\n", "Epoch: 2500 TSS error: 0.0767642188932 %correct: 0.0\n", "--------------------------------------------------\n", "Epoch: 2998 TSS error: 0.0360360377038 %correct: 1.0\n", "CPU times: user 2.29 s, sys: 41 ms, total: 2.33 s\n", "Wall time: 2.3 s\n" ] } ], "source": [ "%%time\n", "net.train()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", "Input: [1, 1]\n", "Output: [ 0.08480704]\n", "\n", "Input: [1, 0]\n", "Output: [ 0.9001344]\n", "\n", "Input: [0, 1]\n", "Output: [ 0.90375743]\n", "\n", "Input: [0, 0]\n", "Output: [ 0.09789055]\n", "\n", "--------------------------------------------------\n", "Epoch: 2998 TSS error: 0.036010565345 %correct: 1.0\n" ] } ], "source": [ "net.test()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generalization" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Although we only trained on the corners, we can see what " ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "res = 50 # resolution\n", "z = np.zeros((res, res))\n", "\n", "for x in range(res):\n", " for y in range(res):\n", " z[x][y] = net.propagate([x/res, y/res])\n", "\n", "plt.imshow(z, cmap=plt.cm.gray, interpolation='nearest')\n", "plt.xlabel(\"input 1\")\n", "plt.ylabel(\"input 2\")\n", "plt.title(\"Output Activation\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Handwriting Categorization\n", "\n", "First, I'll use the metakernel's %download magic to get the MNIST hand written data:" ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already up-to-date: metakernel in /home/dblank/.local/lib/python3.4/site-packages\n", "Requirement already up-to-date: IPython>=3.0 in /usr/local/lib/python3.4/dist-packages (from metakernel)\n", "Requirement already up-to-date: prompt-toolkit<2.0.0,>=1.0.3 in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: pygments in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: pickleshare in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: simplegeneric>0.8 in /usr/lib/python3/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: traitlets>=4.2 in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: setuptools>=18.5 in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: pexpect; sys_platform != \"win32\" in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: decorator in /usr/local/lib/python3.4/dist-packages (from IPython>=3.0->metakernel)\n", "Requirement already up-to-date: wcwidth in /usr/local/lib/python3.4/dist-packages (from prompt-toolkit<2.0.0,>=1.0.3->IPython>=3.0->metakernel)\n", "Requirement already up-to-date: six>=1.9.0 in /usr/local/lib/python3.4/dist-packages (from prompt-toolkit<2.0.0,>=1.0.3->IPython>=3.0->metakernel)\n", "Requirement already up-to-date: ipython-genutils in /usr/local/lib/python3.4/dist-packages (from traitlets>=4.2->IPython>=3.0->metakernel)\n", "Requirement already up-to-date: ptyprocess>=0.5 in /usr/local/lib/python3.4/dist-packages (from pexpect; sys_platform != \"win32\"->IPython>=3.0->metakernel)\n" ] } ], "source": [ "! pip install metakernel --user -U" ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import metakernel" ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [], "source": [ "metakernel.register_ipython_magics()" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Downloaded 'mnist.pkl.gz'.\n" ] } ], "source": [ "%download http://deeplearning.net/data/mnist/mnist.pkl.gz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Unzip the file:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [], "source": [ "!gunzip mnist.pkl.gz" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From http://deeplearning.net/tutorial/gettingstarted.html we see that:\n", "\n", "> The pickled file represents a tuple of 3 lists: the training set, the validation set and the testing set. Each of the three lists is a pair formed from a list of images and a list of class labels for each of the images. An image is represented as numpy 1-dimensional array of 784 (28 x 28) float values between 0 and 1 (0 stands for black, 1 for white). The labels are numbers between 0 and 9 indicating which digit the image represents." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We read the Python2 pickled data:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pickle\n", "import gzip\n", "import numpy\n", "\n", "with open('mnist.pkl', 'rb') as f:\n", " u = pickle._Unpickler(f)\n", " u.encoding = 'latin1'\n", " data = u.load()\n", " train_set, validation_set, test_set = data" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_set)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "50000" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_set[0])" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "784" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(train_set[0][0])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": true }, "outputs": [], "source": [ "net = Network(784, 100, 1)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [], "source": [ "inputs = [train_set[0][i] for i in range(len(train_set[0]))]\n", "targets = [[train_set[1][i]/9.0] for i in range(len(train_set[0]))]\n", "\n", "inputs = inputs[:100]\n", "targets = targets[:100]" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def display_digit(vector):\n", " for r in range(28):\n", " for c in range(28):\n", " v = int(vector[r * 28 + c] * 10)\n", " ch = \" .23456789\"[v]\n", " print(ch, end=\"\")\n", " print()\n", " \n", "net.display_test_input = display_digit\n", "net.set_inputs(list(zip(inputs, targets)))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", " \n", " \n", " \n", " \n", " \n", " 456.6994 \n", " ..36699999869972 \n", " .99999999993332. \n", " 8999997799 \n", " 364998 .6 \n", " 693 \n", " 597 \n", " 792 \n", " .9864 \n", " 39994 \n", " .7995. \n", " 3997 \n", " 9992 \n", " .57998 \n", " .5899997 \n", " 48999973 \n", " 28999973 \n", " 68999973 \n", " 268999995 \n", " 5999855 \n", " \n", " \n", " \n", "Output: [ 0.99891001]\n", "\n", " \n", " \n", " \n", " \n", " .696. \n", " .99999 \n", " 28999992 \n", " 2899973994 \n", " 69999993796 \n", " .9997498.396 \n", " .9996 24 99. \n", " .69983 996 \n", " 6992 . 997 \n", " 2992 997 \n", " 797 997 \n", " 2994 995 \n", " 398 597 \n", " 398 5982 \n", " 395 .696 \n", " 398 4996 \n", " 3995..3689862 \n", " 39998899975 \n", " .79999995 \n", " 59995. \n", " \n", " \n", " \n", " \n", "Output: [ 0.55365357]\n", "\n", "--------------------------------------------------\n", "Epoch: 0 TSS error: 0.503095454484 %correct: 0.0\n" ] } ], "source": [ "net.test(stop=2)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Training for max trails: 5000 ...\n", "Epoch: 0 TSS error: 34.5930858635 %correct: 0.11\n", "Epoch: 10 TSS error: 1.32377985833 %correct: 0.36\n", "Epoch: 20 TSS error: 0.411839130644 %correct: 0.79\n", "Epoch: 30 TSS error: 0.267324372292 %correct: 0.84\n", "Epoch: 40 TSS error: 0.107195924523 %correct: 0.88\n", "Epoch: 50 TSS error: 0.0650005585999 %correct: 0.94\n", "Epoch: 60 TSS error: 0.0493717431555 %correct: 0.97\n", "Epoch: 70 TSS error: 0.043711557982 %correct: 0.97\n", "Epoch: 80 TSS error: 0.0405500514493 %correct: 0.97\n", "Epoch: 90 TSS error: 0.0366644043236 %correct: 0.97\n", "Epoch: 100 TSS error: 0.034313203966 %correct: 0.97\n", "Epoch: 110 TSS error: 0.0318499688892 %correct: 0.97\n", "Epoch: 120 TSS error: 0.0299062687577 %correct: 0.97\n", "Epoch: 130 TSS error: 0.0275353365237 %correct: 0.97\n", "Epoch: 140 TSS error: 0.0255731117788 %correct: 0.98\n", "Epoch: 150 TSS error: 0.0237657265998 %correct: 0.98\n", "Epoch: 160 TSS error: 0.0217853045717 %correct: 0.98\n", "Epoch: 170 TSS error: 0.0205203533809 %correct: 0.98\n", "Epoch: 180 TSS error: 0.0192891308384 %correct: 0.98\n", "Epoch: 190 TSS error: 0.0180349146892 %correct: 0.98\n", "Epoch: 200 TSS error: 0.0169340681206 %correct: 0.98\n", "Epoch: 210 TSS error: 0.0158070771527 %correct: 0.98\n", "Epoch: 220 TSS error: 0.0146831200809 %correct: 0.98\n", "Epoch: 230 TSS error: 0.0134813714854 %correct: 0.98\n", "Epoch: 240 TSS error: 0.012385217457 %correct: 0.98\n", "Epoch: 250 TSS error: 0.0112564637369 %correct: 0.99\n", "Epoch: 260 TSS error: 0.010090158313 %correct: 0.99\n", "Epoch: 270 TSS error: 0.00917840283389 %correct: 0.99\n", "Epoch: 280 TSS error: 0.00815744190596 %correct: 0.99\n", "Epoch: 290 TSS error: 0.00733798184843 %correct: 0.99\n", "Epoch: 300 TSS error: 0.00654885033663 %correct: 0.99\n", "--------------------------------------------------\n", "Epoch: 301 TSS error: 0.00646222887812 %correct: 1.0\n" ] } ], "source": [ "net.train(report_rate=10, tolerance=0.05)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------------------------\n", "Test:\n", " \n", " \n", " \n", " \n", " 594 \n", " .6996 \n", " 69994 \n", " .8994 \n", " 89992 \n", " .9997 \n", " 4997 \n", " 698 55. \n", " 894 27998 \n", " 4992 69999 \n", " 698 699759 \n", " 996 798.39 \n", " 993 .982 79 \n", " 997 795 498 \n", " 89922995598. \n", " 69998999994 \n", " .899999994 \n", " .589964 \n", " .892 \n", " 77 \n", " \n", " \n", " \n", " \n", "Output: [ 0.66869171]\n", "\n", " \n", " \n", " \n", " \n", " \n", " 27 \n", " 98 \n", " 99. \n", " 99. \n", " 992 \n", " 994 \n", " 995 \n", " 695 \n", " 695 \n", " 696 \n", " 699 \n", " 499 \n", " 399. \n", " 399. \n", " 895 \n", " 59 \n", " 59 \n", " 593 \n", " 89. \n", " 68. \n", " \n", " \n", " \n", "Output: [ 0.11049537]\n", "\n", "--------------------------------------------------\n", "Epoch: 301 TSS error: 4.47996246077e-06 %correct: 1.0\n" ] } ], "source": [ "net.test(stop=2)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "target: 5 output: [ 0.5584583] correct? True\n", "target: 0 output: [ 0.0008485] correct? True\n", "target: 4 output: [ 0.44625995] correct? True\n", "target: 1 output: [ 0.11636889] correct? True\n", "target: 9 output: [ 0.98132617] correct? True\n", "target: 2 output: [ 0.22265295] correct? True\n", "target: 1 output: [ 0.11216834] correct? True\n", "target: 3 output: [ 0.33391114] correct? True\n", "target: 1 output: [ 0.11049537] correct? True\n", "target: 4 output: [ 0.44476502] correct? True\n", "target: 3 output: [ 0.33293912] correct? True\n", "target: 5 output: [ 0.5550864] correct? True\n", "target: 3 output: [ 0.33548028] correct? True\n", "target: 6 output: [ 0.66781011] correct? True\n", "target: 1 output: [ 0.11115588] correct? True\n", "target: 7 output: [ 0.77782846] correct? True\n", "target: 2 output: [ 0.22327943] correct? True\n", "target: 8 output: [ 0.90372405] correct? False\n", "target: 6 output: [ 0.6682901] correct? True\n", "target: 9 output: [ 0.99286186] correct? True\n", "target: 4 output: [ 0.44585381] correct? True\n", "target: 0 output: [ 0.01176537] correct? True\n", "target: 9 output: [ 0.99292711] correct? True\n", "target: 1 output: [ 0.1193728] correct? True\n", "target: 1 output: [ 0.11261315] correct? True\n", "target: 2 output: [ 0.22296757] correct? True\n", "target: 4 output: [ 0.44638858] correct? True\n", "target: 3 output: [ 0.33519845] correct? True\n", "target: 2 output: [ 0.22383731] correct? True\n", "target: 7 output: [ 0.77823576] correct? True\n", "target: 3 output: [ 0.3339225] correct? True\n", "target: 8 output: [ 0.88386224] correct? True\n", "target: 6 output: [ 0.66813708] correct? True\n", "target: 9 output: [ 0.99328892] correct? True\n", "target: 0 output: [ 0.01710055] correct? True\n", "target: 5 output: [ 0.55611384] correct? True\n", "target: 6 output: [ 0.66800721] correct? True\n", "target: 0 output: [ 0.01060943] correct? True\n", "target: 7 output: [ 0.77842164] correct? True\n", "target: 6 output: [ 0.66869171] correct? True\n", "target: 1 output: [ 0.10930293] correct? True\n", "target: 8 output: [ 0.88915716] correct? True\n", "target: 7 output: [ 0.77856935] correct? True\n", "target: 9 output: [ 0.99875116] correct? True\n", "target: 3 output: [ 0.33546722] correct? True\n", "target: 9 output: [ 0.98503236] correct? True\n", "target: 8 output: [ 0.88970639] correct? True\n", "target: 5 output: [ 0.55658756] correct? True\n", "target: 9 output: [ 0.98189089] correct? True\n", "target: 3 output: [ 0.33377757] correct? True\n", "target: 3 output: [ 0.33397867] correct? True\n", "target: 0 output: [ 0.00286018] correct? True\n", "target: 7 output: [ 0.77872041] correct? True\n", "target: 4 output: [ 0.44471772] correct? True\n", "target: 9 output: [ 0.98409994] correct? True\n", "target: 8 output: [ 0.88883533] correct? True\n", "target: 0 output: [ 0.01091531] correct? True\n", "target: 9 output: [ 0.98088028] correct? True\n", "target: 4 output: [ 0.44629353] correct? True\n", "target: 1 output: [ 0.06208519] correct? False\n", "target: 4 output: [ 0.44495562] correct? True\n", "target: 4 output: [ 0.44485125] correct? True\n", "target: 6 output: [ 0.66695151] correct? True\n", "target: 0 output: [ 0.00458729] correct? True\n", "target: 4 output: [ 0.4457556] correct? True\n", "target: 5 output: [ 0.55519786] correct? True\n", "target: 6 output: [ 0.66771432] correct? True\n", "target: 1 output: [ 0.11676264] correct? True\n", "target: 0 output: [ 0.01224035] correct? True\n", "target: 0 output: [ 0.0111766] correct? True\n", "target: 1 output: [ 0.11258252] correct? True\n", "target: 7 output: [ 0.77944614] correct? True\n", "target: 1 output: [ 0.11289874] correct? True\n", "target: 6 output: [ 0.66782986] correct? True\n", "target: 3 output: [ 0.33551741] correct? True\n", "target: 0 output: [ 0.00602961] correct? True\n", "target: 2 output: [ 0.22356046] correct? True\n", "target: 1 output: [ 0.11580488] correct? True\n", "target: 1 output: [ 0.11428735] correct? True\n", "target: 7 output: [ 0.77730589] correct? True\n", "target: 9 output: [ 0.9802358] correct? True\n", "target: 0 output: [ 0.00420747] correct? True\n", "target: 2 output: [ 0.22215204] correct? True\n", "target: 6 output: [ 0.66735853] correct? True\n", "target: 7 output: [ 0.77966812] correct? True\n", "target: 8 output: [ 0.88963278] correct? True\n", "target: 3 output: [ 0.33468825] correct? True\n", "target: 9 output: [ 0.98441654] correct? True\n", "target: 0 output: [ 0.00240321] correct? True\n", "target: 4 output: [ 0.44727749] correct? True\n", "target: 6 output: [ 0.66833323] correct? True\n", "target: 7 output: [ 0.77867528] correct? True\n", "target: 4 output: [ 0.44679708] correct? True\n", "target: 6 output: [ 0.66807762] correct? True\n", "target: 8 output: [ 0.89000284] correct? True\n", "target: 0 output: [ 0.01007388] correct? True\n", "target: 7 output: [ 0.77948687] correct? True\n", "target: 8 output: [ 0.88803177] correct? True\n", "target: 3 output: [ 0.33591189] correct? True\n", "target: 1 output: [ 0.11125079] correct? True\n" ] } ], "source": [ "for i in range(100):\n", " output = net.propagate(inputs[i])\n", " target = int(targets[i][0] * 9)\n", " print(\"target:\", target, \"output:\", output, \"correct?\", int(output * 10) == target)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "h = net.get_history()\n", "epochs = [x[0] for x in h]\n", "tss = [x[1] for x in h]\n", "percent = [x[2] for x in h]\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "plt.plot(epochs, tss)\n", "plt.xlabel(\"Epochs\")\n", "plt.ylabel(\"TSS Error\")\n", "plt.show()\n", "plt.plot(epochs, percent)\n", "plt.xlabel(\"Epochs\")\n", "plt.ylabel(\"Percentage Correct\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

References

\n", "\n", "1. http://outlace.com/Beginner-Tutorial-Theano/\n", "2. http://deeplearning.net/software/theano/tutorial/adding.html\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 0 }